function PhpSerialize (mixed_value)
{
	var _getType = function (inp) {
		var type = typeof inp, match;
		var key;
		if (type == 'object' && !inp) {
			return 'null';
		}
		if (type == "object") {
			if (!inp.constructor) {
				return 'object';
			}
			var cons = inp.constructor.toString();
			match = cons.match(/(\w+)\(/);
			if (match) {
				cons = match[1].toLowerCase();
			}
			var types = ["boolean", "number", "string", "array"];
			for (key in types) {
				if (cons == types[key]) {
					type = types[key];
					break;
				}
			}
		}
		return type;
	};
	var type = _getType(mixed_value);
	var val, ktype = '';

	switch (type) {
		case "function":
			val = "";
			break;
		case "boolean":
			val = "b:" + (mixed_value ? "1" : "0");
			break;
		case "number":
			val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
			break;
		case "string":
			val = "s:" + encodeURIComponent(mixed_value).replace(/%../g, 'x').length + ":\"" + mixed_value + "\"";
			break;
		case "array":
		case "object":
			val = "a";
			var count = 0;
			var vals = "";
			var okey;
			var key;
			for (key in mixed_value) {
				ktype = _getType(mixed_value[key]);
				if (ktype == "function") {
					continue;
				}

				okey = (key.match(/^[0-9]+$/) ? parseInt(key, 10) : key);
				vals += this.PhpSerialize(okey) +
				this.PhpSerialize(mixed_value[key]);
				count++;
			}
			val += ":" + count + ":{" + vals + "}";
			break;
		case "undefined": // Fall-through
		default: // if the JS object has a property which contains a null value, the string cannot be unserialized by PHP
			val = "N";
			break;
	}
	if (type != "object" && type != "array") {
		val += ";";
	}
	return val;
}

function PhpUnserialize (data) {
	var error = function (type, msg, filename, line){
		throw new this.window[type](msg, filename, line);
	};
	var read_until = function (data, offset, stopchr){
		var buf = [];
		var chr = data.slice(offset, offset + 1);
		var i = 2;
		while (chr != stopchr) {
			if ((i+offset) > data.length) {
				error('Error', 'Invalid');
			}
			buf.push(chr);
			chr = data.slice(offset + (i - 1),offset + i);
			i += 1;
		}
		return [buf.length, buf.join('')];
	};
	var read_chrs = function (data, offset, length){
		var buf;

		buf = [];
		for (var i = 0;i < length;i++){
			var chr = data.slice(offset + (i - 1),offset + i);
			buf.push(chr);
		}

		return [buf.length, buf.join('')];
	};
	var _unserialize = function (data, offset){
		var readdata;
		var readData;
		var chrs = 0;
		var ccount;
		var stringlength;
		var keyandchrs;
		var keys;

		if (!offset) {
			offset = 0;
		}
		var dtype = (data.slice(offset, offset + 1)).toLowerCase();

		var dataoffset = offset + 2;
		var typeconvert = new Function('x', 'return x');

		switch (dtype){
			case 'i':
				typeconvert = function (x) {
					return parseInt(x, 10);
				};
				readData = read_until(data, dataoffset, ';');
				chrs = readData[0];
				readdata = readData[1];
				dataoffset += chrs + 1;
				break;
			case 'b':
				typeconvert = function (x) {
					return parseInt(x, 10) !== 0;
				};
				readData = read_until(data, dataoffset, ';');
				chrs = readData[0];
				readdata = readData[1];
				dataoffset += chrs + 1;
				break;
			case 'd':
				typeconvert = function (x) {
					return parseFloat(x);
				};
				readData = read_until(data, dataoffset, ';');
				chrs = readData[0];
				readdata = readData[1];
				dataoffset += chrs + 1;
				break;
			case 'n':
				readdata = null;
				break;
			case 's':
				ccount = read_until(data, dataoffset, ':');
				chrs = ccount[0];
				stringlength = ccount[1];
				dataoffset += chrs + 2;

				readData = read_chrs(data, dataoffset+1, parseInt(stringlength, 10));
				chrs = readData[0];
				readdata = readData[1];
				dataoffset += chrs + 2;
				if (chrs != parseInt(stringlength, 10) && chrs != readdata.length){
					error('SyntaxError', 'String length mismatch');
				}
				break;
			case 'a':
				readdata = new Array;

				keyandchrs = read_until(data, dataoffset, ':');
				chrs = keyandchrs[0];
				keys = keyandchrs[1];
				dataoffset += chrs + 2;

				for (var i = 0; i < parseInt(keys, 10); i++){
					var kprops = _unserialize(data, dataoffset);
					var kchrs = kprops[1];
					var key = kprops[2];
					dataoffset += kchrs;

					var vprops = _unserialize(data, dataoffset);
					var vchrs = vprops[1];
					var value = vprops[2];
					dataoffset += vchrs;
					readdata[key] = value;
				}

				dataoffset += 1;
				break;
			default:
				error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
				break;

		}
		return [dtype, dataoffset - offset, typeconvert(readdata)];
	};

	return Utf8.decodeArray(_unserialize(Utf8.encode((data+'').replace(/~`~/gi,'"'), 0))[2]);
}

//if(typeof String.prototype.trim !== 'function')
//  String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); }

function DirectAjaxCore()
{
	var argumenty=new Object();
	var cilovyDiv=arguments[1];
	var asynchronost=arguments[3];
	var parametry=(arguments[2]!="")?$('#'+arguments[2]).serialize():"";
	var preloaderBarVyska = 0;

	for(var i=4; i<arguments.length; i++)
	{
		if (typeof arguments[i] == 'function' || (typeof arguments[i] == 'object' && arguments[i].toString().substr(0, 8) == 'function'))
			var userCallBackFunction=arguments[i];
		else if (typeof arguments[i] == 'object')
			parametry+=(parametry!=""?"&":"")+$.param(arguments[i]);
		else if(arguments[i].substr(0,13)=="js_preloader=")
		{
			//vytvoreni preloaderu
			var preloaderBar = document.createElement('div');
			$(preloaderBar).css('background', 'url('+arguments[i].substr(13)+') no-repeat center center');
			//vytvoreni preloaderu---end
		}
		else if(arguments[i].substr(0,13)=="js_preheight=")
		{
			//vytvoreni preloaderu maunal vysky
			preloaderBarVyska = arguments[i].substr(13);
			//vytvoreni preloaderu maunal vysky---end
		}
		else if(arguments[i].toLowerCase()=="prictikcily=true")
			var prictiKCily=true;
		else
			argumenty[arguments[i].substr(0, arguments[i].indexOf('='))]=arguments[i].substr(arguments[i].indexOf('=')+1);
	}
	var argumentySer=$.param(argumenty);
	if(argumentySer!="")
		parametry+=(parametry!=""?"&":"")+argumentySer;

	var vysledek=$.ajax({
		url: arguments[0],
		type: 'post',
		data: parametry,
		async: asynchronost,
		beforeSend: function(){
			try
			{
				if(preloaderBar)
				{
					if(preloaderBarVyska<1) {
						preloaderBarVyska = $('#'+cilovyDiv).height();
						if(preloaderBarVyska<64)
							preloaderBarVyska=64;
					}
					$(preloaderBar).css('height', preloaderBarVyska+'px');

					if(prictiKCily)
						$(preloaderBar).slideDown('fast');
					else
						$('#'+cilovyDiv).html('');

					$('#'+cilovyDiv).append(preloaderBar);
				}
			}
			catch(e){}
		},
		success: function(data){
			if(asynchronost)
			{
				try
				{
					if(prictiKCily)
					{
						if(preloaderBar) 
							window.document.getElementById(cilovyDiv).removeChild(preloaderBar);
        		$("#"+cilovyDiv).append(data);
				}
					else
						window.document.getElementById(cilovyDiv).innerHTML=data;
				}
				catch(e){}
			}
		try{
			userCallBackFunction(data)
			}catch(e){}
			try{
				if(LOCAL==1 && cilovyDiv=='')window.document.getElementById('ajaxdebug').innerHTML=data;
			}catch(e){}
		},
		dataType: 'html'
});

if(asynchronost)
	return(true);
else
	return(vysledek);
}

/**
  * bool DirectAjax(adresaDireckCall, cilovyDiv, zdrojovyFormular [,'idetifier=X' [,function(){UserCallBack()}] [,prictiKCily=true] [,'param=X']])
  */
function DirectAjax()
{
	var args=[];
	for(var i=0;i<3;i++)
		args.push(arguments[i]);

	args.push(true);

	for(var i=3;i<arguments.length;i++)
		args.push(arguments[i]);

	return(DirectAjaxCore.apply(this,args));
}

/**
  * string DirectAjax(adresaDireckCall, zdrojovyFormular [,'idetifier=X' [,'param=X']])
  */
function DirectAjaxData()
{
	var args=[];

	args.push(arguments[0]);
	args.push("");
	args.push(arguments[1]);
	args.push(false);

	for(var i=2;i<arguments.length;i++)
		args.push(arguments[i]);

	var vysledek=DirectAjaxCore.apply(this,args);

	if(vysledek.status==200)
		return (vysledek.responseText);
	else
		return (false);
}
